package fr.grobim.hangovers.gestionBudget.services.factures.impl;

import java.util.List;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import fr.grobim.hangovers.gestionBudget.beans.factures.Facture;
import fr.grobim.hangovers.gestionBudget.beans.factures.ReglementFacture;
import fr.grobim.hangovers.gestionBudget.beans.factures.SourceFacture;
import fr.grobim.hangovers.gestionBudget.daos.factures.FactureDao;
import fr.grobim.hangovers.gestionBudget.daos.factures.ReglementFactureDao;
import fr.grobim.hangovers.gestionBudget.daos.factures.SourceFactureDao;
import fr.grobim.hangovers.gestionBudget.services.factures.FacturationService;

@Service
@Transactional(readOnly = true)
public class FacturationServiceImpl implements FacturationService {
	
	@Autowired
	private FactureDao factureDao;
	
	@Autowired
	private SourceFactureDao sourceFactureDao;
	
	@Autowired
	private ReglementFactureDao reglementFactureDao;
	
	@Override
	public Facture obtenirFacture(Integer id) {
		return factureDao.consulterParId(id);
	}

	@Override
	public Facture obtenirFacture(Facture facture) {
		return factureDao.consulterParId(facture.getId());
	}

	@Override
	public Facture obtenirFactureAvecReglements(Integer id) {
		Facture factureRetour = obtenirFacture(id);
		factureRetour.getReglements().size();
		return factureRetour;
	}

	@Override
	public Facture obtenirFactureAvecReglements(Facture facture) {
		return obtenirFactureAvecReglements(facture.getId());
	}

	@Override
	public SourceFacture obtenirSourceFacture(Integer id) {
		return sourceFactureDao.consulterParId(id);
	}

	@Override
	public SourceFacture obtenirSourceFacture(SourceFacture sourceFacture) {
		return obtenirSourceFacture(sourceFacture.getId());
	}

	@Override
	public ReglementFacture obtenirReglement(Integer id) {
		return this.reglementFactureDao.consulterParId(id);
	}

	@Override
	public ReglementFacture obtenirReglement(ReglementFacture reglementFacture) {
		return this.obtenirReglement(reglementFacture.getId());
	}

	@Override
	public List<SourceFacture> listerToutesSourcesFacture() {
		return sourceFactureDao.listerTous();
	}

	@Override
	public List<Facture> listerToutesFactures() {
		return factureDao.listerTous();
	}

	@Override
	@Transactional(readOnly = false)
	public void ajouterOuModifierFacture(Facture facture) {
		factureDao.creerOuModifier(facture);
	}

	@Override
	@Transactional(readOnly = false)
	public void ajouterOuModifierSourceFacture(SourceFacture sourceFacture) throws ConstraintViolationException {
		sourceFactureDao.creerOuModifier(sourceFacture);
	}

	@Override
	@Transactional(readOnly = false)
	public void ajouterOuModifierReglement(ReglementFacture reglementFacture) {
		this.reglementFactureDao.creerOuModifier(reglementFacture);
	}

	@Override
	@Transactional(readOnly = false)
	public void supprimerFacture(Integer id) {
		Facture factureSelectionnee = this.obtenirFacture(id);
		factureSelectionnee.getMembresConcernesParDefaut().clear();
		this.ajouterOuModifierFacture(factureSelectionnee);
		this.factureDao.supprimer(factureSelectionnee);
	}

	@Override
	@Transactional(readOnly = false)
	public void supprimerFacture(Facture facture) {
		supprimerFacture(facture.getId());
	}

	@Override
	@Transactional(readOnly = false)
	public void supprimerReglementFacture(Integer id) {
		ReglementFacture reglementASupprimer = this.obtenirReglement(id);
		reglementASupprimer.getMembreConcernes().clear();
		this.ajouterOuModifierReglement(reglementASupprimer);
		this.reglementFactureDao.supprimer(reglementASupprimer);
	}

	@Override
	@Transactional(readOnly = false)
	public void supprimerReglementFacture(ReglementFacture reglementFacture) {
		this.supprimerReglementFacture(reglementFacture.getId());
	}

	@Override
	@Transactional(readOnly = false)
	public void supprimerSourceFacture(Integer id) {
		sourceFactureDao.supprimer(sourceFactureDao.consulterParId(id));
	}

	@Override
	@Transactional(readOnly = false)
	public void supprimerSourceFacture(SourceFacture sourceFacture) {
		supprimerFacture(sourceFacture.getId());
	}

	@Override
	public List<ReglementFacture> listerTousReglementsParFacture(Integer id) {
		return reglementFactureDao.obtenirReglementFactureParFacture(id, null);
	}

	@Override
	public List<ReglementFacture> listerTousReglementsParFacture(Facture facture) {
		return listerTousReglementsParFacture(facture.getId());
	}
	
	@Override
	public List<ReglementFacture> listerTousReglementsParFacture(Integer id, Integer maxResultats) {
		return reglementFactureDao.obtenirReglementFactureParFacture(id, maxResultats);
	}
	
	@Override
	public List<ReglementFacture> listerTousReglementsParFacture(Facture facture, Integer maxResultats) {
		return listerTousReglementsParFacture(facture.getId(), maxResultats);
	}

	@Override
	@Transactional(readOnly = false)
	public void reglerFacture(ReglementFacture reglementFacture) {
		this.reglementFactureDao.creerOuModifier(reglementFacture);
	}
	
}
